/*
Problem Description
给定一个m × n (m行, n列)的迷宫，迷宫中有两个位置，gloria想从迷宫的一个位置走到另外一个位置，
当然迷宫中有些地方是空地，gloria可以穿越，有些地方是障碍，她必须绕行，从迷宫的一个位置，
只能走到与它相邻的4个位置中,当然在行走过程中，gloria不能走到迷宫外面去。
令人头痛的是，gloria是个没什么方向感的人，因此，她在行走过程中，不能转太多弯了，否则她会晕倒的。
我们假定给定的两个位置都是空地，初始时，gloria所面向的方向未定，她可以选择4个方向的任何一个出发，
而不算成一次转弯。gloria能从一个位置走到另外一个位置吗？
 
Input
第1行为一个整数t (1 ≤ t ≤ 100),表示测试数据的个数，接下来为t组测试数据，每组测试数据中，
第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数，接下来m行，每行包括n个字符，
其中字符'.'表示该位置为空地，字符'*'表示该位置为障碍，输入数据中只有这两种字符，
每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),
其中k表示gloria最多能转的弯数，(x1, y1), (x2, y2)表示两个位置，其中x1，x2对应列，y1, y2对应行。
 
Output
每组测试数据对应为一行，若gloria能从一个位置走到另外一个位置，输出“yes”，否则输出“no”。
 
Sample Input
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
 
Sample Output
no
yes

 */
package com.yuan.algorithms.team20150724;

import java.io.BufferedInputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class WayNode {
	int x, y;
	int direction;// 方向

	public WayNode(int x, int y, int d) {
		this.x = x;
		this.y = y;
		this.direction = d;
	}
}

public class 广搜_逃离迷宫 {

	static int m, n;
	static final int[][] val = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
	static int[][] swerve = new int[105][105];/**记录拐弯次数*/  
	
	static Scanner sc = new Scanner(new BufferedInputStream(System.in));
	// static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static char[][] map = new char[105][105];
	static Queue<WayNode> queue = new LinkedList<WayNode>();

	public static void main(String[] args) {
		while (sc.hasNext()) {
			int t = sc.nextInt();
			while (--t >= 0) {
				m = sc.nextInt();
				n = sc.nextInt();
				for (int i = 0; i < m; i++) {
					String str = sc.next();
					for (int j = 0; j < n; j++) {
						map[i][j] = str.charAt(j);
						swerve[i][j] = Integer.MAX_VALUE;//拐弯次数初始化为最大值
					}
				}
				int k = sc.nextInt();// 能转弯的次数
				int startY = sc.nextInt() - 1;// 起点列下标
				int startX = sc.nextInt() - 1;// 起点行下标
				int endY = sc.nextInt() - 1;// 终点列下标
				int endX = sc.nextInt() - 1;// 终点行下标

				queue.clear();// 清空队列
				queue.add(new WayNode(startX, startY, -1));
				swerve[startX][startY] = 0;
				boolean result = false;
				
				_f: while (!queue.isEmpty()) {
					WayNode node = queue.poll();
					if (node.x == endX && node.y == endY) {// 判断是否到达终点
						result = true;// 标记结果，结束搜索
						break;
					}
					for (int i = 0; i < 4; i++) {
						int newX = node.x + val[i][0];
						int newY = node.y + val[i][1];
						if (judge(newX, newY)) {// 搜索位置合法性判断
							if (swerve[node.x][node.y] >= swerve[newX][newY]) {
								continue;
							}
							swerve[newX][newY] = swerve[node.x][node.y];
							if (node.direction != -1 && node.direction != i) {// 上次的方向和本次搜索的方向是否相同
								++swerve[newX][newY]; // 不相同则拐弯次数+1
							}
							if (swerve[newX][newY] > k) {// 拐弯次数大于限制，跳过
								continue;
							}
							if (swerve[newX][newY] == k && (newX != endX && newY != endY)) {
								// 拐弯次数用完了还和终点不在同一行和列上，则不可能到达终点了，跳过
								continue;
							}
							if (newX == endX && newY == endY) {// 预判断是否到达终点
								result = true;// 标记结果，结束搜索，节省队列的操作
								break _f;
							}
							queue.add(new WayNode(newX, newY, i));// 加入队列进行下一次搜索
						}
					}
				}
				out.println(result ? "yes" : "no");
				out.flush();
			}
		}
	}

	/**
	 * 判断当前坐标是否可访问
	 * 
	 * @param x
	 * @param y
	 * @return
	 */
	private static boolean judge(int x, int y) {
		return x >= 0 && x < m && y >= 0 && y < n && map[x][y] == '.';
	}

}
